#include "LRU-replacer.h"
// #include "replacer.h"
#include <cassert>

LRUReplacer::LRUReplacer(size_t max_size)
    : max_size_(max_size) {
    assert(max_size > 0 && "LRUReplacer max_size must be greater than 0");
}



void LRUReplacer::Insert(frame_id_t frame_id) {
    std::lock_guard<std::mutex> guard(latch_);

    // 如果已存在，先移除（避免重复）
    if (lru_map_.find(frame_id) != lru_map_.end()) {
        lru_list_.erase(lru_map_[frame_id]);
        lru_map_.erase(frame_id);
    }

    // 插入到链表头部（最近使用）
    lru_list_.push_front(frame_id);
    lru_map_[frame_id] = lru_list_.begin();

    // 如果超出容量，淘汰尾部（最久未使用）
    if (lru_map_.size() > max_size_) {
        frame_id_t back_frame = lru_list_.back();
        lru_list_.pop_back();
        lru_map_.erase(back_frame);
    }
}

bool LRUReplacer::Victim(frame_id_t* frame_id) {
    std::lock_guard<std::mutex> guard(latch_);

    if (lru_list_.empty()) {
        *frame_id = INVALID_FRAME_ID;
        return false;
    }

    // 取出尾部帧作为 victim
    *frame_id = lru_list_.back();
    lru_map_.erase(*frame_id);
    lru_list_.pop_back();

    return true;
}

bool LRUReplacer::Erase(frame_id_t frame_id) {
    std::lock_guard<std::mutex> guard(latch_);

    auto it = lru_map_.find(frame_id);
    if (it == lru_map_.end()) {
        return false; // 不存在
    }

    lru_list_.erase(it->second);
    lru_map_.erase(it);
    return true;
}

size_t LRUReplacer::Size() {
    std::lock_guard<std::mutex> guard(latch_);
    return lru_map_.size();
}